package plateau;

import java.util.Iterator;

import structureDeDonnee.Cell;
import structureDeDonnee.Matrice;
import structureDeDonnee.Position;

import affichagePlateau.AffichagePlateauInfini;

/**
 * class implémentant plateau avec les règles d'un monde de taille infini
 * 
 * @see Cell
 */

public class PlateauInfini extends PlateauGeneral {

	/**
	 * 
	 * @param matrice
	 *            une matrice contenant la liste des cellules vivantes
	 * @param valeursDeSurvie
	 *            un tableau comprenant une liste des valeurs permetant à une
	 *            cellule vivante de rester vivante à l'étape suivant
	 * @param valeursDeNaissance
	 *            un tableau comprenant une liste des valeurs permetant à une
	 *            cellule morte de devenir vivante à l'étape suivante
	 */
	public PlateauInfini(Matrice matrice, int[] valeursDeSurvie,
			int[] valeursDeNaissance) {
		super(matrice, valeursDeSurvie, valeursDeNaissance);
	}


@Override
	public boolean estUneTranslation(Matrice matriceAComparer,
			Position p) {
		assert (p != null && matrice.length() != 0 );

		if (matriceAComparer.length() == matrice.length()) {
			Cell c1 = matrice.getPremiereCellule();
			Cell c2 = matriceAComparer.getPremiereCellule();

			// on compare la position des deux cellules les plus en bas à
			// gauche
			// dans
			// listeAComparer et listeCellulesVivantes
			int x = c2.getPosition().getX() - c1.getPosition().getX();
			int y = c2.getPosition().getY() - c1.getPosition().getY();

			Iterator<Cell> it1 = matrice.iterator();
			Iterator<Cell> it2 = matriceAComparer.iterator();
			while (it1.hasNext()) { // si it1 a une elements it2 aussi car les
									// deux listes font la même taille
				c1 = it1.next();
				c2 = it2.next();
				if (c1.getPosition().getX() + x != c2.getPosition().getX()
						|| c1.getPosition().getY() + y != c2.getPosition()
								.getY()) {
					return false;
				}
			}
			p.setX(x);
			p.setY(y);
			return true;
		}
		return false;

	}

	@Override
	public PlateauInfini clone() {
		return new PlateauInfini(matrice.clone(),
				valeursDeSurvie, valeursDeNaissance);
	}

	@Override
	public boolean afficher() {
		return AffichagePlateauInfini.display(this);
	}

	@Override
	protected void ajouteCelluleMatricesVoisines(Cell tmp, Matrice[] tab) {
		int posXCell = tmp.getPosition().getX();
		int posYCell = tmp.getPosition().getY();
		Cell tmp1 = new Cell(1, posXCell - 1, posYCell + 1);
		Cell tmp2 = new Cell(1, posXCell, posYCell + 1);
		Cell tmp3 = new Cell(1, posXCell + 1, posYCell + 1);
		Cell tmp4 = new Cell(1, posXCell - 1, posYCell);
		Cell tmp5 = new Cell(9, posXCell, posYCell);
		Cell tmp6 = new Cell(1, posXCell + 1, posYCell);
		Cell tmp7 = new Cell(1, posXCell - 1, posYCell - 1);
		Cell tmp8 = new Cell(1, posXCell, posYCell - 1);
		Cell tmp9 = new Cell(1, posXCell + 1, posYCell - 1);
		tab[0].add(tmp1);
		tab[1].add(tmp2);
		tab[2].add(tmp3);
		tab[3].add(tmp4);
		tab[4].add(tmp5);
		tab[5].add(tmp6);
		tab[6].add(tmp7);
		tab[7].add(tmp8);
		tab[8].add(tmp9);
	}

}
